home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / MSDOS / grqc.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  4KB  |  218 lines

  1. /* --------------------------------- grqc.c --------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* Vga graphics driver (uses quickC graphics library).
  8. */
  9.  
  10. #include "fly.h"
  11.  
  12. #ifdef FLY8_MSC
  13.  
  14. #include <conio.h>
  15.  
  16. #ifdef C7GRAPH
  17. #include <c7graph.h>
  18. #else
  19. #include <graph.h>
  20. #endif
  21.  
  22.  
  23. #define DOSYNC        0x0001
  24. #define BIGPAGE        0x0006
  25. #define POSTSYNC    0x0008
  26. #define INITED        0x1000
  27.  
  28. #define MAX_SYNC_WAIT    1000L    /* 1 second is long enough */
  29.  
  30. static struct videoconfig    vc[1] = {0};
  31. static Uint            LastColor = (Uint)-1;
  32.  
  33. LOCAL_FUNC int FAR
  34. QcSetVisual (int page)
  35. {
  36.     int    port;
  37.     Ulong    lasttime;
  38.  
  39.     if (2 == CS->device->colors)
  40.         port = 0x3ba;        /* monochrome */
  41.     else
  42.         port = 0x3da;        /* colour */
  43.     lasttime = st.lasttime;
  44.  
  45.     if (CS->device->flags & DOSYNC) {
  46.         while (inp (port) & 0x01) {    /* wait for Display Enabled */
  47.             sys_poll (20);
  48.             if (st.lasttime - lasttime > MAX_SYNC_WAIT) {
  49.                 LogPrintf ("%s: sync timed out\n", Gr->name);
  50.                 die ();
  51.             }
  52.         }
  53.  
  54.     }
  55.     _setvisualpage (page);
  56.     if (CS->device->flags & (DOSYNC|POSTSYNC)) {
  57.         while (inp (port) & 0x08) {    /* wait for Vert Sync start */
  58.             sys_poll (21);
  59.             if (st.lasttime - lasttime > MAX_SYNC_WAIT) {
  60.                 LogPrintf ("%s: sync timed out\n", Gr->name);
  61.                 die ();
  62.             }
  63.  
  64.         }
  65.         while (!(inp (port) & 0x08)) {    /* wait for Vert Sync end */
  66.             sys_poll (22);
  67.             if (st.lasttime - lasttime > MAX_SYNC_WAIT) {
  68.                 LogPrintf ("%s: sync timed out\n", Gr->name);
  69.                 die ();
  70.             }
  71.  
  72.         }
  73.     }
  74.     return (0);
  75. }
  76.  
  77. LOCAL_FUNC int FAR
  78. QcSetActive (int page)
  79. {
  80.     _setactivepage (page);
  81.     return (0);
  82. }
  83.  
  84. LOCAL_FUNC void FAR
  85. QcDrawTo (int x, int y, Uint color)
  86. {
  87.     if (color != LastColor) {
  88.         _setcolor (color);
  89.         LastColor = color;
  90.     }
  91.     _lineto (x, y);
  92. }
  93.  
  94. LOCAL_FUNC int FAR
  95. QcWriteMode (int mode)
  96. {
  97.     switch (mode) {
  98.     case T_MSET:
  99.         _setwritemode (_GPSET);
  100.         break;
  101.     case T_MOR:
  102.         _setwritemode (_GOR);
  103.         break;
  104.     case T_MXOR:
  105.         _setwritemode (_GXOR);
  106.         break;
  107.     }
  108.     return (0);
  109. }
  110.  
  111. LOCAL_FUNC int FAR
  112. QcSetPalette (int index, long c)
  113. {
  114.     int    r, g, b;
  115.  
  116.     r = C_RGB_R (c);
  117.     g = C_RGB_G (c);
  118.     b = C_RGB_B (c);
  119.  
  120.     c = (((0x03fL&(b>>2))<<16) + ((0x03fL&(g>>2))<<8) + (0x03fL&(r>>2)));
  121.  
  122.     _remappalette (index, c);
  123.     return (0);
  124. }
  125.         
  126. LOCAL_FUNC int FAR
  127. QcInit (DEVICE *dev, char *options)
  128. {
  129.     long        temp;
  130.  
  131.     if (_setvideomode (dev->mode) == 0)
  132.         return (1);
  133.  
  134.     _getvideoconfig (vc);
  135.     if (vc->numxpixels == 0)
  136.         return (1);
  137.     dev->npages = vc->numvideopages;
  138.  
  139.     if (get_narg (options, "shutters=", &temp))
  140.         st.misc[7] = (int)temp;
  141.     else
  142.         st.misc[7] = 0;
  143.  
  144.     Gr->flags |= INITED;
  145.  
  146.     return (0);
  147. }
  148.  
  149. LOCAL_FUNC void FAR
  150. QcTerm (DEVICE *dev)
  151. {
  152.     if (!(Gr->flags & INITED))
  153.         return;
  154.     Gr->flags &= ~INITED;
  155.  
  156.     _setvideomode (_DEFAULTMODE);
  157. }
  158.  
  159. LOCAL_FUNC void FAR
  160. QcEllipse (int x1, int y1, int rx, int ry, Uint color)
  161. {
  162.     if (color != LastColor) {
  163.         _setcolor (color);
  164.         LastColor = color;
  165.     }
  166.     _ellipse (_GBORDER, x1-rx, y1+ry, x1+rx, y1-ry);
  167. }
  168.  
  169. #if 0
  170. LOCAL_FUNC void FAR
  171. QcClear (SCREEN *scr)
  172. {
  173.     /* set bg color = scr->BgColor */
  174.     _clearscreen (_GCLEARSCREEN);
  175. }
  176. #endif
  177.  
  178. LOCAL_FUNC int FAR
  179. QcShutters (int eye)
  180. {
  181.     if (st.misc[7]) {
  182.         if (eye >= 0)
  183.             outp (st.misc[7]+4, 1+2*eye);
  184.         else if (-1 == eye)
  185.             outp (st.misc[7]+4, 1);        /* on */
  186.         else if (-2 == eye)
  187.             outp (st.misc[7]+4, 0);        /* off */
  188.         return (0);                /* have shutters */
  189.     } else
  190.         return (1);                /* no shutters */
  191. }
  192.  
  193. struct GrDriver NEAR GrQc = {
  194.     "GrQC",
  195.     0,
  196.     NULL,    /* extra */
  197.     0,
  198.     QcInit,
  199.     QcTerm,
  200.     _moveto,
  201.     QcDrawTo,
  202.     QcSetVisual,
  203.     QcSetActive,
  204.     0,    /* QcClear() too slow */
  205.     QcWriteMode,
  206.     QcSetPalette,
  207.     QcEllipse,
  208.     0,    /* Flush */
  209.     QcShutters
  210. };
  211. #undef DOSYNC
  212. #undef BIGPAGE
  213. #undef POSTSYNC
  214. #undef INITED
  215. #undef MAX_SYNC_WAIT
  216.  
  217. #endif /* ifdef FLY8_MSC */
  218.